Модуль json
Модуль json определяет процедуры работы с форматом JSON. Он создан на основе модуля Lua-CJSON от Mark Pulford. Полное руководство по Lua-CJSON включено в официальную документацию.
Ниже приведен перечень всех функций и элементов модуля json.
| Имя | Назначение |
|---|---|
| json.encode() | Конвертация Lua-объекта в JSON-строку |
| json.decode() | Конвертация JSON-строки в Lua-объект |
| __serialize parameter | Output structure specification |
| json.cfg() | Изменение конфигурации |
| json.NULL | Аналог «nil» в языке Lua |
-
json.encode(lua-value[, configuration])¶ Конвертация Lua-объекта в JSON-строку.
Параметры: - lua_value – скалярное значение или значение из Lua-таблицы.
- configuration – see json.cfg
возвращает: оригинальное значение, преобразованное в JSON-строку.
тип возвращаемого значения: строка
Пример:
tarantool> json=require('json') --- ... tarantool> json.encode(123) --- - '123' ... tarantool> json.encode({123}) --- - '[123]' ... tarantool> json.encode({123, 234, 345}) --- - '[123,234,345]' ... tarantool> json.encode({abc = 234, cde = 345}) --- - '{"cde":345,"abc":234}' ... tarantool> json.encode({hello = {'world'}}) --- - '{"hello":["world"]}' ...
-
json.decode(string[, configuration])¶ Конвертация JSON-строки в Lua-объект.
Параметры: возвращает: оригинальное содержание в формате Lua-таблицы.
тип возвращаемого значения: таблица
Пример:
tarantool> json = require('json') --- ... tarantool> json.decode('123') --- - 123 ... tarantool> json.decode('[123, "hello"]') --- - [123, 'hello'] ... tarantool> json.decode('{"hello": "world"}').hello --- - world ...
Чтобы увидеть применение
json.decode()в приложении, см. практическое задание Подсчет суммы по JSON-полям во всех кортежах.
__serialize parameter:
Структуру JSON-вывода можно указать с помощью __serialize:
- „seq“, „sequence“, „array“ - table encoded as an array
- „map“, „mapping“ - table encoded as a map
- function - the meta-method called to unpack serializable representation of table, cdata or userdata objects
Serializing „A“ and „B“ with different __serialize values brings different
results:
tarantool> json.encode(setmetatable({'A', 'B'}, { __serialize="seq"}))
---
- '["A","B"]'
...
tarantool> json.encode(setmetatable({'A', 'B'}, { __serialize="map"}))
---
- '{"1":"A","2":"B"}'
...
tarantool> json.encode({setmetatable({f1 = 'A', f2 = 'B'}, { __serialize="map"})})
---
- '[{"f2":"B","f1":"A"}]'
...
tarantool> json.encode({setmetatable({f1 = 'A', f2 = 'B'}, { __serialize="seq"})})
---
- '[[]]'
...
-
json.cfg(table)¶ Set values that affect the behavior of json.encode and json.decode.
The values are all either integers or boolean
true/false.Характеристика Значение по умолчанию Назначение cfg.encode_max_depth128 Max recursion depth for encoding cfg.encode_deep_as_nilfalse (ложь) A flag saying whether to crop tables with nesting level deeper than cfg.encode_max_depth. Not-encoded fields are replaced with one null. If not set, too deep nesting is considered an error.cfg.encode_invalid_numberstrue A flag saying whether to enable encoding of NaN and Inf numbers cfg.encode_number_precision14 Precision of floating point numbers cfg.encode_load_metatablestrue A flag saying whether the serializer will follow __serialize metatable field cfg.encode_use_tostringfalse (ложь) A flag saying whether to use tostring()for unknown typescfg.encode_invalid_as_nilfalse (ложь) A flag saying whether use NULL for non-recognized types cfg.encode_sparse_converttrue A flag saying whether to handle excessively sparse arrays as maps. See detailed description below. cfg.encode_sparse_ratio2 1/ encode_sparse_ratiois the permissible percentage of missing values in a sparse array.cfg.encode_sparse_safe10 A limit ensuring that small Lua arrays are always encoded as sparse arrays (instead of generating an error or encoding as a map) cfg.decode_invalid_numberstrue A flag saying whether to enable decoding of NaN and Inf numbers cfg.decode_save_metatablestrue A flag saying whether to set metatables for all arrays and maps cfg.decode_max_depth128 Max recursion depth for decoding
Важно
cfg.decode_save_metatables. Decoder uses globally defined tables as metatables for arrays and maps.
You must not change entries of decode() result’s table metatable, because it affects all results
and may lead to undefined behavior of other code. See Yaml for a detailed example.
Sparse arrays features:
During encoding, the JSON encoder tries to classify a table into one of four kinds:
- map - at least one table index is not unsigned integer
- regular array - all array indexes are available
- sparse array - at least one array index is missing
- excessively sparse array - the number of values missing exceeds the configured ratio
An array is excessively sparse when all the following conditions are met:
encode_sparse_ratio> 0max(table)>encode_sparse_safemax(table)>count(table)*encode_sparse_ratio
The JSON encoder will never consider an array to be excessively sparse
when encode_sparse_ratio = 0. The encode_sparse_safe limit ensures
that small Lua arrays are always encoded as sparse arrays.
By default, attempting to encode an excessively sparse array will
generate an error. If encode_sparse_convert is set to true,
excessively sparse arrays will be handled as maps.
json.cfg() example 1:
The following code will encode 0/0 as NaN («not a number») and 1/0 as Inf («infinity»), rather than returning nil or an error message:
json = require('json')
json.cfg{encode_invalid_numbers = true}
x = 0/0
y = 1/0
json.encode({1, x, y, 2})
Результат запроса json.encode() будет следующим:
tarantool> json.encode({1, x, y, 2})
---
- '[1,nan,inf,2]
...
json.cfg example 2:
To avoid generating errors on attempts to encode unknown data types as userdata/cdata, you can use this code:
tarantool> httpc = require('http.client').new()
---
...
tarantool> json.encode(httpc.curl)
---
- error: unsupported Lua type 'userdata'
...
tarantool> json.encode(httpc.curl, {encode_use_tostring=true})
---
- '"userdata: 0x010a4ef2a0"'
...
Примечание
To achieve the same effect for only one call to json.encode() (i.e.
without changing the configuration permanently), you can use
json.encode({1, x, y, 2}, {encode_invalid_numbers = true}).
Similar configuration settings exist for MsgPack and YAML.
-
json.NULL¶ Значение, сопоставимое с нулевым значением «nil» в языке Lua, которое можно использовать в качестве объекта-заполнителя в кортеже.
Пример:
-- Когда полю Lua-таблицы присваивается nil, это поле -- null tarantool> {nil, 'a', 'b'} --- - - null - a - b ... -- Когда полю Lua-таблицы присваивается json.NULL, это поле -- json.NULL tarantool> {json.NULL, 'a', 'b'} --- - - null - a - b ... -- Когда JSON-полю присваивается json.NULL, это поле -- null tarantool> json.encode({field2 = json.NULL, field1 = 'a', field3 = 'c'}) --- - '{"field2":null,"field1":"a","field3":"c"}' ...